/* @author cerimice */
package Dialogos.Modulo.OrdenServicio;

import Dialogos.Modal.OrdenServicio.CierreOrdenServicioDlg;
import Dialogos.Modal.OrdenServicio.DatosOrdenServicioDlg;
import Dialogos.Modal.OrdenServicio.ReporteCierreOrdenServicioDlg;
import Logica.Modulo.OrdenServicio.OrdenServicioLogica;
import Logica.Modulo.OrdenServicio.SeguimientoOrdenServicioLogica;
import Persistencia.Definicion.OrdenServicio;
import Persistencia.Definicion.SeguimientoOrdenServicio;
import Sistema.Configuracion;
import cerimice.ComboLista;
import com.vaadin.data.Property;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.terminal.StreamResource;
import com.vaadin.terminal.ThemeResource;
import com.vaadin.ui.*;
import com.vaadin.ui.Window.Notification;
import com.vaadin.ui.themes.BaseTheme;
import java.util.logging.Logger;


public class SeguimientoOrdenServicioDlg extends Panel
    {
    private OrdenServicioLogica logica;
    private SeguimientoOrdenServicioLogica seguimientoLogica;
    
    private TextField   claveOrden,valorBusqueda,claveSeguimiento;
    private TextArea    descripcionSeguimiento;
    private ComboLista  estadoOrden,busquedaEstadoOrden;
    private Button      botonBuscar,agregarSeguimiento,informacionOrden,cambiarEstadoOrden,/*modificarSeguimiento,*/operaciónAgregarSeguimiento,operaciónModificarSeguimiento,imprimirOrdenServicio,reportePorEstado,cierreOrdenServicio,reporteCierreOrden;
    private Table       tablaOrdenes,tablaSeguimiento;
    
    public SeguimientoOrdenServicioDlg()
        {
        agregarComponentes();
        }
    
    private void agregarComponentes()
        {
        logica = new OrdenServicioLogica();
        seguimientoLogica = new SeguimientoOrdenServicioLogica();
        
        claveOrden = new TextField();
        valorBusqueda       = new TextField("Proporcione el folio de la orden de servicio:");   valorBusqueda.setWidth("425px");
        busquedaEstadoOrden = new ComboLista("Proporcione el estado de la orden de servicio"); busquedaEstadoOrden.setWidth("425px");
        tablaOrdenes        = new Table("Listado de Ordenes de Servicio");
            tablaOrdenes.setWidth("950px");
            tablaOrdenes.setHeight("300px");
            tablaOrdenes.setNullSelectionAllowed(false);
            tablaOrdenes.setSelectable(true);
            tablaOrdenes.setImmediate(true);
            tablaOrdenes.addContainerProperty("FOLIO",String.class,"");
            tablaOrdenes.addContainerProperty("FECHA DE ENTRADA",String.class,"");
            tablaOrdenes.addContainerProperty("FALLA DEL EQUIPO",String.class,"");
            tablaOrdenes.addContainerProperty("CLIENTE",String.class,"");
            tablaOrdenes.addContainerProperty("ESTADO",String.class,"");
            tablaOrdenes.setColumnWidth("FOLIO",100);
            tablaOrdenes.setColumnWidth("FECHA DE ENTRADA",150);
            tablaOrdenes.setColumnWidth("FALLA DEL EQUIPO",300);
            tablaOrdenes.setColumnWidth("CLIENTE",200);
            tablaOrdenes.setColumnWidth("ESTADO",150);
            tablaOrdenes.addListener(new Property.ValueChangeListener() {@Override public void valueChange(ValueChangeEvent event) {cargarInformacionSeleccionado();}});
        
        estadoOrden         = new ComboLista("Estado de la Orden");                 estadoOrden.setWidth("400px");
        tablaSeguimiento    = new Table("Seguimiento proporcionado");
            tablaSeguimiento.setWidth("600px");
            tablaSeguimiento.setNullSelectionAllowed(false);
            tablaSeguimiento.setSelectable(true);
            tablaSeguimiento.setImmediate(true);
            tablaSeguimiento.addContainerProperty("CLAVE",String.class,"");
            tablaSeguimiento.addContainerProperty("SOPORTE TÉCNICO",TextArea.class,"");
            tablaSeguimiento.setColumnWidth("CLAVE",150);
            tablaSeguimiento.setColumnWidth("SOPORTE TECNICO",475);
            //tablaSeguimiento.addListener(new Property.ValueChangeListener() {@Override public void valueChange(ValueChangeEvent event) {cargarInformacionSeguimiento();}});

        claveSeguimiento        = new TextField("Clave Seguimiento");           claveSeguimiento.setWidth("300px");         claveSeguimiento.setEnabled(false);         claveSeguimiento.setVisible(false);
        descripcionSeguimiento  = new TextArea("Descripción del seguimiento");  descripcionSeguimiento.setWidth("300px");   descripcionSeguimiento.setVisible(false);
        
        try
            {
            busquedaEstadoOrden.addListItems(logica.getListaEstadoOrdenServicio());
            estadoOrden.addListItems(logica.getListaEstadoOrdenServicio());
            }
        catch(Exception ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),ex.getMessage());}
        
        botonBuscar = new Button("BUSCAR");
            botonBuscar.setWidth("100px");
            botonBuscar.addListener(new Button.ClickListener()              {@Override public void buttonClick(Button.ClickEvent event){cargarInformacionBusqueda();}});
        informacionOrden = new Button();
            informacionOrden.setWidth("32px");
            informacionOrden.setIcon(new ThemeResource("icons/personal/informacionOrden.png"));
            informacionOrden.setStyleName(BaseTheme.BUTTON_LINK);
            informacionOrden.setDescription("Muestra la información de la Orden de servicio");
            informacionOrden.addListener(new Button.ClickListener() {@Override public void buttonClick(Button.ClickEvent event){mostrarInformacionOrdenServicio();}});
        cambiarEstadoOrden = new Button("CAMBIAR ESTADO");
            cambiarEstadoOrden.setWidth("32px");
            cambiarEstadoOrden.setIcon(new ThemeResource("icons/personal/aceptar.png"));
            cambiarEstadoOrden.setStyleName(BaseTheme.BUTTON_LINK);
            cambiarEstadoOrden.setDescription("Cambiar el estado para la Orden de Servicio Seleccionada");
            cambiarEstadoOrden.addListener(new Button.ClickListener() {@Override public void buttonClick(Button.ClickEvent event){cambiarEstadoOrden();}});
        agregarSeguimiento = new Button();
            agregarSeguimiento.setWidth("32px");
            agregarSeguimiento.setIcon(new ThemeResource("icons/personal/agregarSeguimientoOrdenServicio.png"));
            agregarSeguimiento.setStyleName(BaseTheme.BUTTON_LINK);
            agregarSeguimiento.setDescription("agregar seguimiento");
            agregarSeguimiento.addListener(new Button.ClickListener() {@Override public void buttonClick(Button.ClickEvent event){cargarAgregarSeguimientoOrdenServicio();}});
        /*modificarSeguimiento = new Button();
            modificarSeguimiento.setWidth("32px");
            modificarSeguimiento.setIcon(new ThemeResource("icons/personal/modificarSeguimientoOrdenServicio.png"));
            modificarSeguimiento.setStyleName(BaseTheme.BUTTON_LINK);
            modificarSeguimiento.setDescription("modificar seguimiento");
            modificarSeguimiento.addListener(new Button.ClickListener() {@Override public void buttonClick(Button.ClickEvent event){cargarModificarSeguimientoOrdenServicio();}});*/
        imprimirOrdenServicio = new Button();
            imprimirOrdenServicio.setWidth("32px");
            imprimirOrdenServicio.setIcon(new ThemeResource("icons/personal/imprimirOrdenServicio.png"));
            imprimirOrdenServicio.setStyleName(BaseTheme.BUTTON_LINK);
            imprimirOrdenServicio.setDescription("actualizar seguimiento");
            imprimirOrdenServicio.addListener(new Button.ClickListener() {@Override public void buttonClick(Button.ClickEvent event){accionImprimirOrdenServicio();}});
        operaciónAgregarSeguimiento = new Button("AGREGAR");
            operaciónAgregarSeguimiento.setWidth("300px");
            operaciónAgregarSeguimiento.setVisible(false);
            operaciónAgregarSeguimiento.addListener(new Button.ClickListener() {@Override public void buttonClick(Button.ClickEvent event){accionAgregarSeguimientoOrdenServicio();}});
        operaciónModificarSeguimiento = new Button("MODIFICAR");
            operaciónModificarSeguimiento.setWidth("300px");
            operaciónModificarSeguimiento.setVisible(false);
            operaciónModificarSeguimiento.addListener(new Button.ClickListener() {@Override public void buttonClick(Button.ClickEvent event){accionModificarSeguimientoOrdenServicio();}});
        reportePorEstado = new Button();
            reportePorEstado.setWidth("32px");
            reportePorEstado.setIcon(new ThemeResource("icons/personal/reportePorEstado.png"));
            reportePorEstado.setStyleName(BaseTheme.BUTTON_LINK);
            reportePorEstado.setDescription("Generación de reporte por estado de Orden de Servicio");
            reportePorEstado.addListener(new Button.ClickListener() {@Override public void buttonClick(Button.ClickEvent event){generarReporteOrdenesPorEstado();}});
        cierreOrdenServicio = new Button();
            cierreOrdenServicio.setWidth("32px");
            cierreOrdenServicio.setIcon(new ThemeResource("icons/personal/cierreOrdenServicio.png"));
            cierreOrdenServicio.setStyleName(BaseTheme.BUTTON_LINK);
            cierreOrdenServicio.setDescription("Generar cierre para orden de servicio");
            cierreOrdenServicio.addListener(new Button.ClickListener() {@Override public void buttonClick(Button.ClickEvent event){generarCierreOrdenServicio();}});
        reporteCierreOrden = new Button();
            reporteCierreOrden.setWidth("32px");
            reporteCierreOrden.setIcon(new ThemeResource("icons/personal/reporteCierreOrdenServicio.png"));
            reporteCierreOrden.setStyleName(BaseTheme.BUTTON_LINK);
            reporteCierreOrden.setDescription("Generar reporte cierre para orden de servicio");
            reporteCierreOrden.addListener(new Button.ClickListener() {@Override public void buttonClick(Button.ClickEvent event){generarReporteCierreOrdenServicio();}});
        
        VerticalLayout busqueda = new VerticalLayout();
            HorizontalLayout camposBuscar = new HorizontalLayout();
                camposBuscar.addComponent(valorBusqueda);
                camposBuscar.addComponent(busquedaEstadoOrden);
                camposBuscar.addComponent(botonBuscar);
            busqueda.addComponent(camposBuscar);
            busqueda.addComponent(tablaOrdenes);
            HorizontalLayout seguimientoOperaciones = new HorizontalLayout();
                seguimientoOperaciones.addComponent(informacionOrden);
                seguimientoOperaciones.addComponent(agregarSeguimiento);
                //seguimientoOperaciones.addComponent(modificarSeguimiento);
                seguimientoOperaciones.addComponent(imprimirOrdenServicio);
                seguimientoOperaciones.addComponent(reportePorEstado);
                seguimientoOperaciones.addComponent(cierreOrdenServicio);
                seguimientoOperaciones.addComponent(reporteCierreOrden);
            busqueda.addComponent(seguimientoOperaciones);
            busqueda.setComponentAlignment(seguimientoOperaciones, Alignment.TOP_CENTER);
        
        HorizontalLayout datosSeguimiento = new HorizontalLayout();
            VerticalLayout seguimientoServicio = new VerticalLayout();
                seguimientoServicio.setCaption("SEGUIMIENTO DEL SERVICIO");
                HorizontalLayout datosSeguimientoParteA = new HorizontalLayout();
                    datosSeguimientoParteA.addComponent(estadoOrden);
                    datosSeguimientoParteA.addComponent(cambiarEstadoOrden);
                    //datosSeguimientoParteA.setWidth("920px");
                seguimientoServicio.addComponent(datosSeguimientoParteA);
                seguimientoServicio.addComponent(tablaSeguimiento);
                //seguimientoServicio.setWidth("920px");
            VerticalLayout seguimientoCampos = new VerticalLayout();
                seguimientoCampos.addComponent(claveSeguimiento);
                seguimientoCampos.addComponent(descripcionSeguimiento);
                seguimientoCampos.addComponent(operaciónAgregarSeguimiento);
                seguimientoCampos.addComponent(operaciónModificarSeguimiento);
            datosSeguimiento.addComponent(seguimientoServicio);
            datosSeguimiento.addComponent(seguimientoCampos);
            datosSeguimiento.setComponentAlignment(seguimientoServicio, Alignment.TOP_CENTER);
            datosSeguimiento.setComponentAlignment(seguimientoCampos, Alignment.TOP_CENTER);
            datosSeguimiento.setWidth("940px");
                    
        VerticalLayout principal = new VerticalLayout();
            principal.addComponent(busqueda);
            principal.addComponent(datosSeguimiento);
            principal.setComponentAlignment(busqueda, Alignment.TOP_CENTER);
            principal.setComponentAlignment(datosSeguimiento, Alignment.TOP_CENTER);
        
        this.addComponent(principal);
        this.setCaption("SEGUIMIENTO DE ORDENES DE SERVICIO");
        this.setIcon(new ThemeResource("icons/personal/seguimientoOrdenServicio.png"));
        }
    
    private void cargarInformacionBusqueda()
        {
        try
            {
            int tipoBusqueda = 1;
            String valor = (String)valorBusqueda.getValue();
            if(valor.equals("")){valor = busquedaEstadoOrden.getSelectedKey(); tipoBusqueda = 4;}
            if(valor==null)     {valor = ""; tipoBusqueda = 1;}
            tablaOrdenes = logica.generarTabla(tipoBusqueda,valor,tablaOrdenes);
            }
        catch (Exception ex)
            {
            Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),ex.getMessage());
            try
                {tablaOrdenes = logica.generarTabla(1,"",tablaOrdenes);}
            catch (Exception ex1)
                {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),ex1.getMessage());}
            }
        }
    
    private void mostrarInformacionOrdenServicio()
        {
        String orden = (String)claveOrden.getValue();
        if((orden.equals("")) || (orden==null)){getWindow().showNotification("Seguimiento de Orden de Servicio...","Por favor seleccione una orden de servicio",Notification.TYPE_WARNING_MESSAGE); return;}
        getWindow().addWindow(new DatosOrdenServicioDlg(orden));
        }
    
    private void cargarInformacionSeleccionado()
        {
        try
            {
            TextArea objArea;
            OrdenServicio obj = logica.obtenerObjeto((String)tablaOrdenes.getValue());
            
            claveOrden.setValue(obj.getClave());
            estadoOrden.setSelectedKey(""+obj.getEstado());
            
            tablaSeguimiento.removeAllItems();
            for(SeguimientoOrdenServicio o:obj.getSeguimiento())
                {
                objArea = new TextArea("",o.getDescripcion());
                    objArea.setWidth("280px");
                    objArea.setHeight("60px");
                    objArea.setEnabled(true);
                tablaSeguimiento.addItem(new Object[]{o.getClave(),objArea},o.getClave());}
            }
        catch (Exception ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),ex.getMessage());}
        }
    
    private void cambiarEstadoOrden()
        {
        try
            {
            String orden    = (String)claveOrden.getValue();
            if(orden.equals("") || orden == null){getWindow().showNotification("Cambiar Estado...","No existe una orden seleccionada",Notification.TYPE_WARNING_MESSAGE);}
            String estado   = estadoOrden.getSelectedKey();
            if(!logica.modificarObjeto(orden,Integer.parseInt(estado),true))
                {getWindow().showNotification("Cambiar Estado...",logica.getError(),Notification.TYPE_WARNING_MESSAGE);}
             }
        catch(NullPointerException ex)
            {getWindow().showNotification("Cambiar Estado...","Por favor seleccione un estado valido",Notification.TYPE_WARNING_MESSAGE);}
        catch(Exception ex)
        {}
        }
    
    private void cargarAgregarSeguimientoOrdenServicio()
        {
        try
            {
            String orden = (String)claveOrden.getValue();
            if((orden.equals("")) || (orden==null)){getWindow().showNotification("Seguimiento de Orden de Servicio...","Por favor seleccione una orden de servicio",Notification.TYPE_WARNING_MESSAGE); return;}
            claveSeguimiento.setVisible(true);
            claveSeguimiento.setValue("");
            descripcionSeguimiento.setVisible(true);
            descripcionSeguimiento.setValue("");
            operaciónAgregarSeguimiento.setVisible(true);
            operaciónModificarSeguimiento.setVisible(false);
            
            }
        catch(NullPointerException ex)
            {getWindow().showNotification("Seguimiento Orden de Servicio...","Por favor seleccione una Orden de servicio",Notification.TYPE_WARNING_MESSAGE);}
        catch(Exception ex)
            {}
        }
    
    /*private void cargarModificarSeguimientoOrdenServicio()
        {
        try
            {
            String seguimiento = (String)tablaSeguimiento.getValue();
            if((seguimiento.equals("")) || (seguimiento==null)){getWindow().showNotification("Seguimiento de Orden de Servicio...","Por favor seleccione un seguimiento de orden",Notification.TYPE_WARNING_MESSAGE); return;}
            claveSeguimiento.setVisible(true);
            claveSeguimiento.setValue("");
            descripcionSeguimiento.setVisible(true);
            descripcionSeguimiento.setValue("");
            operaciónModificarSeguimiento.setVisible(true);
            operaciónAgregarSeguimiento.setVisible(false);
            
            SeguimientoOrdenServicio obj = seguimientoLogica.obtener(seguimiento);
                claveSeguimiento.setValue(obj.getClave());
                descripcionSeguimiento.setValue(obj.getDescripcion());
            }
        catch(NullPointerException ex)
            {getWindow().showNotification("Seguimiento Orden de Servicio...","Por favor seleccione un seguimiento de la tabla",Notification.TYPE_WARNING_MESSAGE);}
        catch(Exception ex)
            {}
        }*/
    
    private void accionAgregarSeguimientoOrdenServicio()
        {
        try
            {
            if(seguimientoLogica.agregarObjeto((String)claveOrden.getValue(),(String)descripcionSeguimiento.getValue()))
                {
                getWindow().showNotification("Agregar Seguimiento...","Seguimiento agregado con exito",Notification.TYPE_TRAY_NOTIFICATION);
                claveSeguimiento.setVisible(false);
                descripcionSeguimiento.setVisible(false);
                operaciónAgregarSeguimiento.setVisible(false);
                cargarInformacionSeleccionado();
                }
            else
                {getWindow().showNotification("Modificar Seguimiento...",seguimientoLogica.getError(),Notification.TYPE_WARNING_MESSAGE);}
            }
        catch(NullPointerException ex)
            {getWindow().showNotification("Seguimiento Orden de Servicio...","Por favor proporcione datos valido",Notification.TYPE_WARNING_MESSAGE);}
        catch(Exception ex)
            {}
        }
    
    private void accionModificarSeguimientoOrdenServicio()
        {
        try
            {
            if(seguimientoLogica.modificarObjeto((String)tablaSeguimiento.getValue(),(String)descripcionSeguimiento.getValue()))
                {
                getWindow().showNotification("Modificar Seguimiento...","Seguimiento modificado con exito",Notification.TYPE_TRAY_NOTIFICATION);
                claveSeguimiento.setVisible(false);
                descripcionSeguimiento.setVisible(false);
                operaciónModificarSeguimiento.setVisible(false);
                cargarInformacionSeleccionado();
                return;
                }
            else
                {getWindow().showNotification("Modificar Seguimiento...",seguimientoLogica.getError(),Notification.TYPE_WARNING_MESSAGE);}
            }
        catch(NullPointerException ex)
            {getWindow().showNotification("Seguimiento Orden de Servicio...","Por favor proporcione datos valido",Notification.TYPE_WARNING_MESSAGE);}
        catch(Exception ex)
            {}
        }
    
    private void accionImprimirOrdenServicio()
        {
        try
            {
            String ordenServicio = (String)claveOrden.getValue();
            if(ordenServicio ==  null || ordenServicio.equals("") || ordenServicio.length()==0)
                {getWindow().showNotification("Seguimiento Orden de Servicio...","Por favor Seleccione una orden de servicio.",Notification.TYPE_WARNING_MESSAGE); return;}
            
            Window window = new Window();
                ((VerticalLayout) window.getContent()).setSizeFull();
                window.setResizable(true);
                window.setWidth("800");
                window.setHeight("600");
                window.center();
            Embedded e = new Embedded();
                e.setSizeFull();
                e.setType(Embedded.TYPE_BROWSER);
            StreamResource resource = new StreamResource(logica.reporteGenerarOrdenServicio(ordenServicio), "OrdenDeServicio"+System.currentTimeMillis()+".pdf",this.getApplication());
                resource.setMIMEType("application/pdf");
                e.setSource(resource);
            window.addComponent(e);
            this.getApplication().getMainWindow().addWindow(window);
            }
        catch (Exception ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),ex.getMessage());}
        }
    
    private void generarReporteOrdenesPorEstado()
        {
        try
            {
            int tipoBusqueda = 4;
            String valor    = null;
            String nombre   = null;
            valor   = busquedaEstadoOrden.getSelectedKey();
            nombre  = busquedaEstadoOrden.getSelectedValue();
            
            Window window = new Window();
                ((VerticalLayout) window.getContent()).setSizeFull();
                window.setResizable(true);
                window.setWidth("800");
                window.setHeight("600");
                window.center();
            Embedded e = new Embedded();
                e.setSizeFull();
                e.setType(Embedded.TYPE_BROWSER);
            StreamResource resource = new StreamResource(logica.generarReporteOrdenesPorEstado(valor,nombre), "OrdenDeServicio"+System.currentTimeMillis()+".pdf",this.getApplication());
                resource.setMIMEType("application/pdf");
                e.setSource(resource);
            window.addComponent(e);
            this.getApplication().getMainWindow().addWindow(window);
            }
        catch (Exception ex)
            {
            getWindow().showNotification("Seguimiento Orden de Servicio...","Por favor Seleccione un estado de Orden de Servicio.",Notification.TYPE_WARNING_MESSAGE);
            Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),ex.getMessage());
            }
        }
    
    private void generarCierreOrdenServicio()
        {
        try
            {
            String orden = (String)claveOrden.getValue();
            if(orden.equals("") || orden == null){getWindow().showNotification("Cierre para orden de Servicio...","No existe una orden seleccionada",Notification.TYPE_WARNING_MESSAGE); return;}
        
            OrdenServicio obj = logica.obtenerObjeto(orden);
            if(obj.getEstado()>=5)
                {
                if(obj.getEstado() == 5)
                    {this.getApplication().getMainWindow().addWindow(new CierreOrdenServicioDlg(orden)); return;}
                else
                    {getWindow().showNotification("Cierre para orden de Servicio...","Esta es una orden cancelada",Notification.TYPE_WARNING_MESSAGE); return;}
                }
        
            this.getApplication().getMainWindow().addWindow(new CierreOrdenServicioDlg(logica,orden));
            }
        catch (Exception ex)
            {
            getWindow().showNotification("Seguimiento Orden de Servicio...","Por favor Seleccione un estado de Orden de Servicio.",Notification.TYPE_WARNING_MESSAGE);
            Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),ex.getMessage());
            }
        }
    
    private void generarReporteCierreOrdenServicio()
        {
        this.getApplication().getMainWindow().addWindow(new ReporteCierreOrdenServicioDlg());
        }
    }
